iT邦幫忙

1

leetcode with python:414. Third Maximum Number

  • 分享至 

  • xImage
  •  

題目:

Given an integer array nums, return the third distinct maximum number in this array. If the third maximum does not exist, return the maximum number.

給定一陣列,找出第三大的數,若不存在,則回傳最大的數

我一開始採用比較簡單的方法

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        s=sorted(set(nums))
        
        if len(s)>=3:
            return s[-3]
        else:
            return s[-1]

將該陣列轉為set後排序
若其長度大於等於3,回傳倒數第三項
反之,回傳最後一項
最後執行時間57ms(faster than 91.03%)

但題目後面又說了一句:

Can you find an O(n) solution?

上面的解法因為用到了sort
所以時間複雜度為O(nlogn),不符合要求

現在我們要用O(n)解

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        n1=None
        n2=None
        n3=None
        
        for i in nums:
            if n1==None or i>n1:
                n1,n2,n3=i,n1,n2
            elif (n2==None or i>n2) and i!=n1:
                n2,n3=i,n2
            elif (n3==None or i>n3) and i!=n1 and i!=n2:
                n3=i
                
                
        if n3==None:
            return n1
        else:
            return n3

預設三個變數(n1,n2,n3)為None
開始遍歷這個陣列
若n1為None或者遍歷的該數大於n1
那n1設為該數
若n2為None或者遍歷的該數大於n2,且該數不等於n1
那n2設為該數
若n3為None或者遍歷的該數大於n3,且該數不等於n1,n2
那n3設為該數
前一個條件失敗才會去思考下一個條件,所以用elif

若最後n3為None(代表第三大的數不存在),回傳n1
反之直接回傳n3
最後執行時間54ms(faster than 94.99%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言